package com.itheima02.map;

import java.util.HashMap;

public class Demo3_Map {
    /*
        map集合中，键是唯一的
            问题：键是怎样做到唯一的呢？
                学习HashMap中的数据结构（数组+链表）
                    答案：需要依赖于类型(Person)中的方法
                         hashCode和equals两个方法配合使用

            细节：存取的顺序不能保证
     */
    public static void main(String[] args) {
        //HashMap泛型的key值为java提供的类型
        HashMap<String, String> hm = new HashMap<>();
        hm.put("张三","深圳");
        hm.put("李四","北京");
        hm.put("王五","上海");
        hm.put("赵六","广州");
        hm.put("赵六","广州");
        //System.out.println(hm);

        //HashMap泛型的key值为自定义类型
        HashMap<Person, String> hm1 = new HashMap<>();
        hm1.put(new Person("张三",27),"深圳");
        hm1.put(new Person("李四",27),"北京");
        hm1.put(new Person("张三",27),"上海");
        System.out.println(hm1);
    }
}

class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //equals方法是，比较数组索引下面的两个节点元素是否一样的内容。如果不一样则往节点下面开始挂，如果一样则不再进行存储
    @Override
    public boolean equals(Object o) {
        if (o instanceof Person) {
            Person p = (Person) o;
            return p.age == this.age && this.name.equals(p.name);
        } else {
            return false; //没有相同的值
        }
    }

    //调用对象的hashCode方法计算出一个int值
    //hashCode的值是取决于元素挂在数组的哪个位置上的
    @Override
    public int hashCode() {
        return 10;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
